package bbalgae.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

/*
 *	Swing 개요
 *	desktop UI를 개발할 때 사용하는 2가지 기술
 *	AWT(abstract window toolkit), Swing 
 *	AWT : java 1.0부터 존재, 현재 Swing으로 대체중
 *	Swing : AWT의 제약을 극복하기 위해발표 Java1.2부터 도입됨 대표적인 기능은 look and feel임
 *	그럼에도 불구하고, Java2D, Java3D를 이용해서 풍부한 그래픽 환경을 제공하려면 AWT가 필요
 *
 * 	AWT vs Swing
 *	이 둘간의 차이점은 컴퍼넌트를 그리는 방법에 있음 
 *	AWT는 운영체제의 라이브러리를 이용 따라서 , AWT로 작성된 프로그램은 윈도우와 리눅스에서 다르게 보임.
 *	하지만, Swing은 운영체제에 종속되지 않은 독립된 라이브러리를 이용 
 *	따라서 Swing을 이용한 프로그램은 윈도우나 리눅스에서 똑같이 보임
 *
 *	효과적인 UI 개발자가 되려면 
 *	UI컴퍼넌트 : JFrame, JDialog, JPanel등의 최상위 컨테이너와 여기에 추가할 수 있는 각종 컴퍼넌트
 *	배치관리자 layout manager : 컨테이너에 컴퍼넌트 배치하는 방법
 *	이벤트처리: 버튼클릭, 마우스이동, 크기조절등의 이벤트에 반응하는 코드작성
 *	
 *	기본 스윙 컴퍼넌트
 *	스윙은 AWT를 대체하며, GUI기반 프로그램 작성을 위한 자바 기술임 하지만, 여전히 AWT이벤트 모델을 사용하고 있음
	스윙 컴퍼넌트는 javax.swing패키지에 포함됨
	java.awt.Container
						<- JComponent, java.awt.Window
						JComponent<- AbstractButton, JComboBox,JLabel, JmenuBar,JPanel
	java.awt.Window <- java.awt.Frame, java.awt.Dialog
	AbstratButton<- JButton, JMenuItem
	java.awtFrate<-JFrame
	java.awt.Dialog<-JDialog
	JMenuItem <- JMenu
	위에서 보듯, AWT와 스윙의 명백한 차이점은 스윙컴포넌트의 이름에는 J라는 접두사가 있음						
	
	2개의 최상위 컨테이너(JFrame,JDialog)를 제외하고 모든 스윙 컴포넌트는 반드시 컨테이너에 포함되어야함
	일반적으로 모든 스윙 프로그램의 주 컨테이너는 JFrame임(중요)
	
	JFrame
	최상위 컨테이너 중 하나
	다른 컴퍼넌트드르은 여기에 배치하려면 add메소드를 호출
	JFrame의 단 하나의 자식요소인 JRootPane을 가지고 있음. 따라서 컴포넌트을 추가하는 코드는 frame명.getContentPane().add(컴포넌트)임
	또한 JFrame 객체를 화면에 나타내기 위해 pack(), setVisible()메소드를 사용함.
	pack() : 자식 컴포넌트에 따라 프레임 크기 조절
	setVisible() : JFrame표시 여부 지정
	JFrame을 화면에서 지우려면 dispose()메소드 호출 
	한편 JFrame의 window 영역에는 title bar와 content pane등의 2개의 영역으로 구분 
	content pane은 JFrame에 의해 생성되는 또 다른 객체임
	일반적으로 JPanel을 content pane으로 사용함
 */

public class J01_HelloSwingFrame extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		// JDK 6+ 에서 스윙 프로그램은 invokeLater메소드를 이용해서 JFrame을 호출하도록 작성하는 것을 추천
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J01_HelloSwingFrame frame = new J01_HelloSwingFrame();
					frame.setVisible(true);
					//생성한 JFrame을 화면에 띄움
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J01_HelloSwingFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//닫기 버튼을 눌렀을 떄 처리할 내용
		// EXIT_ON_CLOSE : System.exit() 호출후 프로그램 종료
		//위 기능 외의 것을 처리하려면 DO_NOTHING_ON_CLOSE를 이용해야함
		
		setBounds(150, 150, 1024, 768);
		//pack() 메소도의 대체제
		//JFrame의 크기를 변경할때 자주 사용
		//setBounds(x위치,y위치,w너비,h높이);
		//setSize(너비,높이);
		// 주의 setVisible이 호출되기전에 
		setResizable(false); //JFrame의 크기조절 불가
		setTitle("Hello, Swing JFrame!!");//JFr	ame의 제목지정
		//JFrame에 컴포넌트를 배치하기 위해 JPanel을 하나 생성해서 content pane에 지정함.
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		// JPanel의 상하좌우 여백 padding 지정
		//방향은 상우하좌 (반시계방향)
		contentPane.setLayout(new BorderLayout(0, 0));
		//컴포넌트 배치 방법을 지정
		//BorderLayout : 5개 영역으로구분해 배치 동서남북,중앙
		setContentPane(contentPane);
		//위에서 생성한 panel을 JFrame의 content pane영역으로 지정
	}

}
